/**
 * 文件导出器类
 * 负责项目文件的打包和导出
 */

export class FileExporter {
    constructor(state) {
        this.state = state;
    }

    /**
     * 下载项目为ZIP文件
     */
    downloadProject() {
        const files = this.state.getProjectFiles();
        if (Object.keys(files).length === 0) {
            this.showAlert('请先生成代码！', 'error');
            return;
        }

        const zip = new JSZip();
        
        // 添加文件到zip
        Object.keys(files).forEach(filename => {
            zip.file(filename, files[filename]);
        });

        // 生成带时间戳的文件名，增加文件唯一性
        const projectName = this.state.getProjectName();
        const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
        const fileName = `${projectName}_${timestamp}.zip`;

        // 生成zip文件并下载
        zip.generateAsync({type:"blob"})
           .then((content) => {
               saveAs(content, fileName);
               this.showAlert(`项目已准备下载，请检查浏览器下载栏`, 'success');
               this.showDownloadInstructions();
           });
    }

    /**
     * 导出项目结构为文本
     */
    exportProjectStructure() {
        const files = this.state.getProjectFiles();
        if (Object.keys(files).length === 0) {
            this.showAlert('导出失败：请先生成代码', 'error');
            return;
        }

        const projectName = this.state.getProjectName();
        const chipModel = this.state.getChipModel();
        const features = this.state.getFeatures();

        let structureText = `# ESP32 项目结构\n`;
        structureText += `项目名称: ${projectName}\n`;
        structureText += `芯片型号: ${chipModel}\n`;
        structureText += `生成时间: ${new Date().toLocaleString('zh-CN')}\n\n`;
        
        structureText += `${projectName}/\n`;
        structureText += `├── CMakeLists.txt\n`;
        structureText += `├── sdkconfig\n`;
        
        if (features.ota) {
            structureText += `├── partitions.csv\n`;
        }
        
        structureText += `├── main/\n`;
        structureText += `│   └── main.c\n`;
        
        // 检查是否有特殊组件
        const pinConfigs = this.state.getPinConfigurations();
        let hasSpecialComponents = false;
        for (const pin in pinConfigs) {
            const config = pinConfigs[pin];
            if (['pwm', 'adc', 'uart', 'i2c', 'spi'].includes(config.mode)) {
                hasSpecialComponents = true;
                break;
            }
        }

        if (hasSpecialComponents || features.httpServer || features.ota) {
            structureText += `└── components/\n`;
            structureText += `    └── ...\n`;
        }
        
        structureText += `\n# 使用说明\n`;
        structureText += `1. 创建项目目录\n`;
        structureText += `2. 按照以上结构创建文件和文件夹\n`;
        structureText += `3. 将生成的代码复制到对应文件中\n`;
        structureText += `4. 在ESP-IDF环境中使用 idf.py build 编译项目\n`;

        // 复制到剪贴板
        navigator.clipboard.writeText(structureText)
            .then(() => {
                this.showAlert('项目结构和使用说明已复制到剪贴板', 'success');
                this.showExportInstructions();
            })
            .catch(err => {
                this.showAlert('复制失败：' + err, 'error');
            });
    }

    /**
     * 显示下载说明
     */
    showDownloadInstructions() {
        // 这里应该调用UI管理器的方法来显示说明
        // 为了简化，我们直接通过全局引用调用
        if (window.esp32DevTool && window.esp32DevTool.ui) {
            // 创建说明元素
            const instructionDiv = document.createElement('div');
            instructionDiv.className = 'mt-4 p-4 bg-blue-900 rounded-lg text-sm download-instructions';
            instructionDiv.innerHTML = `
                <div class="flex items-start">
                    <i class="fas fa-info-circle text-blue-400 mt-1 mr-2"></i>
                    <div>
                        <p class="font-semibold mb-2">下载说明：</p>
                        <ul class="list-disc pl-5 space-y-1">
                            <li>如果浏览器提示安全风险，请点击"保留"或"允许下载"</li>
                            <li>Windows可能会标记ZIP文件，在下载完成后右键点击并选择"保留"</li>
                            <li>如果文件被系统删除，可以使用下方的"导出为文本"功能</li>
                            <li>解压后可在ESP-IDF环境中使用 <code class="bg-gray-700 px-1 rounded">idf.py build</code> 编译项目</li>
                        </ul>
                        <div class="mt-3 pt-3 border-t border-blue-700">
                            <button id="export-as-text-btn" class="text-xs bg-gray-700 hover:bg-gray-600 text-white py-1 px-3 rounded">
                                <i class="fas fa-file-alt mr-1"></i>导出为文本（备选方案）
                            </button>
                        </div>
                    </div>
                </div>
            `;
            
            // 插入到下载按钮区域
            const downloadSection = document.getElementById('download-zip').closest('.flex');
            if (downloadSection) {
                // 检查是否已存在说明
                const existingInstructions = document.querySelector('.download-instructions');
                if (existingInstructions) {
                    existingInstructions.remove();
                }
                
                downloadSection.parentNode.insertBefore(instructionDiv, downloadSection.nextSibling);
                
                // 添加导出为文本按钮事件
                setTimeout(() => {
                    const exportTextBtn = document.getElementById('export-as-text-btn');
                    if (exportTextBtn) {
                        exportTextBtn.addEventListener('click', () => this.exportProjectAsTextAlternative());
                    }
                }, 100);
                
                // 15秒后自动移除说明
                setTimeout(() => {
                    if (instructionDiv.parentNode) {
                        instructionDiv.parentNode.removeChild(instructionDiv);
                    }
                }, 15000);
            }
        }
    }

    /**
     * 导出为文本的备选方案
     */
    exportProjectAsTextAlternative() {
        const files = this.state.getProjectFiles();
        const projectName = this.state.getProjectName();
        const chipModel = this.state.getChipModel();
        
        if (Object.keys(files).length === 0) return;
        
        let projectText = `# ESP32 项目导出\n`;
        projectText += `项目名称: ${projectName}\n`;
        projectText += `芯片型号: ${chipModel}\n`;
        projectText += `生成时间: ${new Date().toLocaleString('zh-CN')}\n\n`;
        
        // 添加所有文件内容
        Object.keys(files).forEach(filename => {
            projectText += `==================== ${filename} ====================\n`;
            projectText += files[filename];
            projectText += `\n\n`;
        });
        
        // 创建可下载的文本文件
        const blob = new Blob([projectText], { type: 'text/plain;charset=utf-8' });
        const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
        const fileName = `${projectName}_${timestamp}_source.txt`;
        saveAs(blob, fileName);
        
        this.showAlert(`项目源码已导出为文本文件: ${fileName}`, 'success');
        
        // 显示使用说明
        this.showTextExportInstructions();
    }

    /**
     * 显示文本导出说明
     */
    showTextExportInstructions() {
        if (window.esp32DevTool && window.esp32DevTool.ui) {
            const instructionDiv = document.createElement('div');
            instructionDiv.className = 'mt-4 p-4 bg-green-900 rounded-lg text-sm';
            instructionDiv.innerHTML = `
                <div class="flex items-start">
                    <i class="fas fa-check-circle text-green-400 mt-1 mr-2"></i>
                    <div>
                        <p class="font-semibold mb-2">文本导出成功：</p>
                        <ul class="list-disc pl-5 space-y-1">
                            <li>文本文件包含所有项目源码，不会被安全软件阻止</li>
                            <li>可按以下步骤重建项目：</li>
                            <li class="ml-5">1. 创建新目录并进入</li>
                            <li class="ml-5">2. 按文件结构创建对应文件</li>
                            <li class="ml-5">3. 将文本中对应内容复制到各文件</li>
                            <li class="ml-5">4. 使用idf.py build编译项目</li>
                        </ul>
                    </div>
                </div>
            `;
            
            const exportBtn = document.getElementById('export-as-text-btn');
            if (exportBtn) {
                const parentDiv = exportBtn.closest('.mt-4');
                if (parentDiv) {
                    // 检查是否已存在说明
                    const existingInstructions = parentDiv.parentNode.querySelector('.bg-green-900');
                    if (!existingInstructions) {
                        parentDiv.parentNode.insertBefore(instructionDiv, parentDiv.nextSibling);
                    }
                }
            }
        }
    }

    /**
     * 显示导出说明
     */
    showExportInstructions() {
        if (window.esp32DevTool && window.esp32DevTool.ui) {
            // 创建说明元素
            const instructionDiv = document.createElement('div');
            instructionDiv.className = 'mt-4 p-4 bg-green-900 rounded-lg text-sm export-instructions';
            instructionDiv.innerHTML = `
                <div class="flex items-start">
                    <i class="fas fa-check-circle text-green-400 mt-1 mr-2"></i>
                    <div>
                        <p class="font-semibold mb-2">导出成功：</p>
                        <ul class="list-disc pl-5 space-y-1">
                            <li>项目结构和使用说明已复制到剪贴板</li>
                            <li>可粘贴到文本编辑器中保存为 README.md</li>
                            <li>按照说明创建项目文件结构</li>
                        </ul>
                    </div>
                </div>
            `;
            
            // 插入到导出按钮区域
            const exportSection = document.getElementById('export-text').closest('.flex');
            if (exportSection) {
                // 检查是否已存在说明
                const existingInstructions = document.querySelector('.export-instructions');
                if (existingInstructions) {
                    existingInstructions.remove();
                }
                
                exportSection.parentNode.insertBefore(instructionDiv, exportSection.nextSibling);
                
                // 10秒后自动移除说明
                setTimeout(() => {
                    if (instructionDiv.parentNode) {
                        instructionDiv.parentNode.removeChild(instructionDiv);
                    }
                }, 10000);
            }
        }
    }

    /**
     * 显示提示信息
     */
    showAlert(message, type = 'info') {
        if (window.esp32DevTool && window.esp32DevTool.ui) {
            window.esp32DevTool.ui.showAlert(message, type);
        }
    }
}